// package top.zxybird.yun.serialization.thrift;
//
// import java.util.Arrays;
// import java.util.Collections;
// import java.util.List;
// import java.util.Map;
// import java.util.stream.Collectors;
// import java.util.stream.IntStream;
//
// import com.google.common.base.Function;
// import com.google.common.base.Preconditions;
// import com.google.common.collect.Lists;
//
// import top.zxybird.yun.common.util.Tuple;
// import top.zxybird.yun.serialization.thrift.model.*;
//
// public class ThriftBinarySerializerBak extends ThriftSerializer {
//
// /**
// * Stop类型需要1个字节
// * <p>
// * 返回(byte)0
// */
// public static List<Byte> doSerialize(TStop in) {
// return Lists.newArrayList(TStop.value);
// }
//
// private static Function serializeTStop = (x) -> Lists.newArrayList(TStop.value);
//
// /**
// * Void类型需要1个字节
// * <p>
// * 返回空
// */
// public static List<Byte> doSerialize(TVoid in) {
// return Collections.emptyList();
// }
//
// private static Function serializeTVoid = (x) -> Collections.emptyList();
//
// /**
// * boolean类型需要4个字节
// * <p>
// * 1个字节的类型 2个字节的编号 1个字节的值
// */
// public static List<Byte> doSerialize(Short number, TBoolean in) {
// if (null == in) {
// return Collections.emptyList();
// }
//
// Preconditions.checkArgument(null != number);
// Preconditions.checkArgument(null != in.getValue());
//
// List<Byte> out = Lists.newArrayListWithExpectedSize(4);
// // 放置类型
// out.addAll(doSerialize(in.getType()));
// // 放置编号
// out.addAll(doSerialize(number));
//
// // 放置值
// out.addAll(doSerialize(in.getValue()));
//
// return out;
// }
//
// private static Function serializeTBoolean = (x) -> {
//
// if (null == x) {
// return Collections.emptyList();
// }
//
// TBoolean in = (TBoolean) x;
//
// Preconditions.checkArgument(null != in.getValue());
//
// List<Byte> out = Lists.newArrayListWithExpectedSize(4);
// // 放置类型
// out.addAll(doSerialize(in.getType()));
// // 放置编号
// out.addAll(doSerialize(in.getNumber()));
//
// // 放置值
// out.addAll(doSerialize(in.getValue()));
//
// return out;
//
// };
//
// /**
// * byte类型需要4个字节
// * <p>
// * 1个字节的类型 2个字节的编号 1个字节的值
// */
// public static List<Byte> doSerialize(Short number, TByte in) {
// if (null == in) {
// return Collections.emptyList();
// }
//
// Preconditions.checkArgument(null != number);
// Preconditions.checkArgument(null != in.getValue());
//
// List<Byte> out = Lists.newArrayListWithExpectedSize(4);
// // 放置类型
// out.addAll(doSerialize(in.getType()));
// // 放置编号
// out.addAll(doSerialize(number));
// // 放置值
// out.addAll(doSerialize(in.getValue()));
//
// return out;
// }
//
// private static Function serializeTByte = (x) -> {
// if (null == x) {
// return Collections.emptyList();
// }
//
// TByte in = (TByte) x;
//
// Preconditions.checkArgument(null != in.getValue());
//
// List<Byte> out = Lists.newArrayListWithExpectedSize(4);
// // 放置类型
// out.addAll(doSerialize(in.getType()));
// // 放置编号
// out.addAll(doSerialize(in.getNumber()));
// // 放置值
// out.addAll(doSerialize(in.getValue()));
//
// return out;
// };
//
// /**
// * double类型需要11个字节
// * <p>
// * 1个字节的类型 2个字节的编号 8个字节的值
// */
// public static List<Byte> doSerialize(Short number, TDouble in) {
// if (null == in) {
// return Collections.emptyList();
// }
//
// Preconditions.checkArgument(null != number);
// Preconditions.checkArgument(null != in.getValue());
//
// List<Byte> out = Lists.newArrayListWithExpectedSize(7);
// // 放置类型
// out.addAll(doSerialize(in.getType()));
// // 放置编号
// out.addAll(doSerialize(number));
// // 放置值
// out.addAll(doSerialize(in.getValue()));
//
// return out;
// }
//
// private static Function serializeTDouble = (x) -> {
// if (null == x) {
// return Collections.emptyList();
// }
//
// TDouble in = (TDouble) x;
//
// Preconditions.checkArgument(null != in.getValue());
//
// List<Byte> out = Lists.newArrayListWithExpectedSize(7);
// // 放置类型
// out.addAll(doSerialize(in.getType()));
// // 放置编号
// out.addAll(doSerialize(in.getNumber()));
// // 放置值
// out.addAll(doSerialize(in.getValue()));
//
// return out;
// };
//
// /**
// * short类型需要5个字节
// * <p>
// * 1个字节的类型 2个字节的编号 2个字节的值
// */
// private static List<Byte> doSerialize(Short number, TShort in) {
// if (null == in) {
// return Collections.emptyList();
// }
//
// Preconditions.checkArgument(null != number);
// Preconditions.checkArgument(null != in.getValue());
//
// List<Byte> out = Lists.newArrayListWithExpectedSize(5);
// // 放置类型
// out.addAll(doSerialize(in.getType()));
// // 放置编号
// out.addAll(doSerialize(number));
// // 放置值
// out.addAll(doSerialize(in.getValue()));
//
// return out;
// }
//
// private static Function serializeTShort = (x) -> {
// if (null == x) {
// return Collections.emptyList();
// }
//
// TShort in = (TShort) x;
//
// Preconditions.checkArgument(null != in.getValue());
//
// List<Byte> out = Lists.newArrayListWithExpectedSize(5);
// // 放置类型
// out.addAll(doSerialize(in.getType()));
// // 放置编号
// out.addAll(doSerialize(in.getNumber()));
// // 放置值
// out.addAll(doSerialize(in.getValue()));
//
// return out;
// };
//
// /**
// * int类型需要7个字节
// * <p>
// * 1个字节的类型 2个字节的编号 4个字节的值
// */
// private static List<Byte> doSerialize(Short number, TInt in) {
// if (null == in) {
// return Collections.emptyList();
// }
//
// Preconditions.checkArgument(null != number);
// Preconditions.checkArgument(null != in.getValue());
//
// List<Byte> out = Lists.newArrayListWithExpectedSize(5);
// // 放置类型
// out.addAll(doSerialize(in.getType()));
// // 放置编号
// out.addAll(doSerialize(number));
// // 放置值
// out.addAll(doSerialize(in.getValue()));
//
// return out;
// }
//
// private static Function serializeTInt = (x) -> {
//
// if (null == x) {
// return Collections.emptyList();
// }
//
// TInt in = (TInt) x;
//
// Preconditions.checkArgument(null != in.getValue());
//
// List<Byte> out = Lists.newArrayListWithExpectedSize(5);
// // 放置类型
// out.addAll(doSerialize(in.getType()));
// // 放置编号
// out.addAll(doSerialize(in.getNumber()));
// // 放置值
// out.addAll(doSerialize(in.getValue()));
//
// return out;
//
// };
//
// /**
// * long类型需要11个字节
// * <p>
// * 1个字节的类型 2个字节的编号 8个字节的值
// */
// public static List<Byte> doSerialize(Short number, TLong in) {
// if (null == in) {
// return Collections.emptyList();
// }
//
// Preconditions.checkArgument(null != number);
// Preconditions.checkArgument(null != in.getValue());
//
// List<Byte> out = Lists.newArrayListWithExpectedSize(5);
// // 放置类型
// out.addAll(doSerialize(in.getType()));
// // 放置编号
// out.addAll(doSerialize(number));
// // 放置值
// out.addAll(doSerialize(in.getValue()));
//
// return out;
// }
//
// private static Function serializeTLong = (x) -> {
//
// if (null == x) {
// return Collections.emptyList();
// }
//
// TLong in = (TLong) x;
//
// Preconditions.checkArgument(null != in.getValue());
//
// List<Byte> out = Lists.newArrayListWithExpectedSize(5);
// // 放置类型
// out.addAll(doSerialize(in.getType()));
// // 放置编号
// out.addAll(doSerialize(in.getNumber()));
// // 放置值
// out.addAll(doSerialize(in.getValue()));
//
// return out;
//
// };
//
// /**
// * long类型需要11个字节
// * <p>
// * 1个字节的类型 2个字节的编号 8个字节的值
// */
// public static List<Byte> doSerialize(Short number, TString in) {
// if (null == in) {
// return Collections.emptyList();
// }
//
// Preconditions.checkArgument(null != number);
// Preconditions.checkArgument(null != in.getValue());
//
// List<Byte> out = Lists.newArrayListWithExpectedSize(7);
// // 放置类型
// out.addAll(doSerialize(in.getType()));
// // ByteListHelper.serialize(out, in.getType());
// // 放置编号
// out.addAll(doSerialize(number));
// // 放置值
// out.addAll(doSerialize(in.getValue()));
// // ByteListHelper.serialize(out, in.getArgs());
//
// return out;
// }
//
// private static Function serializeTString = (x) -> {
//
// if (null == x) {
// return Collections.emptyList();
// }
//
// TString in = (TString) x;
//
// Preconditions.checkArgument(null != in.getValue());
//
// List<Byte> out = Lists.newArrayListWithExpectedSize(7);
// // 放置类型
// out.addAll(doSerialize(in.getType()));
// // ByteListHelper.serialize(out, in.getType());
// // 放置编号
// out.addAll(doSerialize(in.getNumber()));
// // 放置值
// out.addAll(doSerialize(in.getValue()));
// // ByteListHelper.serialize(out, in.getArgs());
//
// return out;
//
// };
//
// public static List<Byte> doSerialize(Short number, TStruct in) {
// if (null == in) {
// return Collections.emptyList();
// }
//
// Preconditions.checkArgument(null != number);
// Preconditions.checkArgument(null != in.getAllField());
//
// List<Byte> out = Lists.newArrayList();
// // 放置类型
// out.add(in.getType());
// // 放置编号
// out.addAll(doSerialize(number));
// // 放置值
//
// List<Tuple.Tuple2<Short, TType>> tupleList = IntStream.range(1, in.getAllField().size() +
// 1).boxed()
// .map(x -> Tuple.tuple(x.shortValue(), in.getAllField().get(x - 1))).collect(Collectors.toList());
//
// for (Tuple.Tuple2<Short, TType> tuple : tupleList) {
//
// out.addAll(doSerialize(tuple._1(), tuple._2()));
//
// }
//
// out.add(TStop.value);
//
// return out;
// }
//
// private static Function serializeTStruct = (x) -> {
// if (null == x) {
// return Collections.emptyList();
// }
//
// TStruct in = (TStruct) x;
//
// Preconditions.checkArgument(null != in.getAllField());
//
// List<Byte> out = Lists.newArrayList();
// // 放置类型
// out.add(in.getType());
// // 放置编号
// out.addAll(doSerialize(in.getNumber()));
// // 放置值
//
// List<Tuple.Tuple2<Short, TType>> tupleList = IntStream.range(1, in.getAllField().size() +
// 1).boxed()
// .map(index -> Tuple.tuple(index.shortValue(), in.getAllField().get(index -
// 1))).collect(Collectors.toList());
//
// for (Tuple.Tuple2<Short, TType> tuple : tupleList) {
//
// out.addAll(doSerialize(tuple._1(), tuple._2()));
//
// }
//
// out.add(TStop.value);
//
// return out;
// };
//
// private enum Type {
// /**
// * Byte
// */
// _Byte(Byte.class, serializeByte),
// /**
// * Boolean
// */
// _Boolean(Boolean.class, serializeBoolean),
// /**
// * Short
// */
// _Short(Short.class, serializeShort),
// /**
// * Integer
// */
// _Integer(Integer.class, serializeInteger),
// /**
// * Long
// */
// _Long(Long.class, serializeLong),
// /**
// * Double
// */
// _Doulbe(Double.class, serializeDouble),
// /**
// * String
// */
// _String(String.class, serializeString),
// /**
// * TStop
// */
// _TStop(TStop.class, serializeTStop),
// /**
// * TVoid
// */
// _TVoid(TVoid.class, serializeTVoid),
// /**
// * TBoolean
// */
// _TBoolean(TBoolean.class, serializeTBoolean),
// /**
// * TByte
// */
// _TByte(TByte.class, serializeTByte),
// /**
// * TDouble
// */
// _TDouble(TDouble.class, serializeTDouble),
// /**
// * TShort
// */
// _TShort(TShort.class, serializeTShort),
// /**
// * TInt
// */
// _TInt(TInt.class, serializeTInt),
// /**
// * TLong
// */
// _TLong(TLong.class, serializeTLong),
// /**
// * TString
// */
// _TString(TString.class, serializeTString),
// /**
// * TStruct
// */
// _TStruct(TStruct.class, serializeTStruct);
//
// private Class clazz;
// private Function function;
//
// Type(Class clazz, Function function) {
// this.clazz = clazz;
// this.function = function;
// }
// }
//
// private static Map<Class, ThriftBinarySerializerBak.Type> typeMap =
// Arrays.stream(ThriftBinarySerializerBak.Type.values())
// .collect(Collectors.toMap(x -> x.clazz, x -> x, (o1, o2) -> o1));
//
// private static ThriftBinarySerializerBak.Type findByTypeWithDefault(Class<?> clazz) {
//
// if (null == clazz) {
// return null;
// }
//
// ThriftBinarySerializerBak.Type type = typeMap.get(clazz);
//
// if (null != type) {
// return type;
// } else {
// return ThriftBinarySerializerBak.Type._TStruct;
// }
//
// }
//
// public static List<Byte> doSerialize(Short number, TType in) {
//
// List<Byte> out;
// if (in instanceof TBoolean) {
// out = doSerialize(number, (TBoolean) in);
// } else if (in instanceof TString) {
// out = doSerialize(number, (TString) in);
// } else {
// out = Collections.emptyList();
// }
//
// return out;
// }
//
// public static List<Byte> doSerialize(TMessage in) {
// if (null == in) {
// return Collections.emptyList();
// }
// Preconditions.checkArgument(null != in.getName());
//
// List<Byte> out = Lists.newArrayList();
//
// // 类型放置在version后最后8位
// int version = ThriftConstant.VERSION_1 | in.getType();
// out.addAll(doSerialize(version));
// out.addAll(doSerialize(in.getName()));
// out.addAll(doSerialize(in.getSeqid()));
//
// List<Tuple.Tuple2<Short, TType>> tupleList = IntStream.range(1, in.getAllField().size() +
// 1).boxed()
// .map(x -> Tuple.tuple(x.shortValue(), in.getAllField().get(x - 1))).collect(Collectors.toList());
//
// for (Tuple.Tuple2<Short, TType> tuple : tupleList) {
//
// out.addAll(doSerialize(tuple._1(), tuple._2()));
//
// }
//
// out.add(TStop.value);
//
// return out;
//
// }
//
// // ======================================== 基本类型 ========================================
//
// public static List<Byte> doSerialize(Byte value) {
//
// if (null == value) {
// return Collections.emptyList();
// }
// return Lists.newArrayList(value);
// }
//
// private static Function serializeByte = (x) -> {
// if (null == x) {
// return Collections.emptyList();
// }
// return Lists.newArrayList(x);
// };
//
// public static List<Byte> doSerialize(Boolean value) {
//
// if (null == value) {
// return Collections.emptyList();
// }
// if (value) {
// return Lists.newArrayList((byte) 1);
// } else {
// return Lists.newArrayList((byte) 0);
// }
//
// }
//
// private static Function serializeBoolean = (x) -> {
// if (null == x) {
// return Collections.emptyList();
// }
//
// Boolean in = (Boolean) x;
//
// if (in) {
// return Lists.newArrayList((byte) 1);
// } else {
// return Lists.newArrayList((byte) 0);
// }
// };
//
// public static List<Byte> doSerialize(Short value) {
//
// if (null == value) {
// return Collections.emptyList();
// }
//
// return Lists.newArrayList((byte) (0xff & (value >> 8)), (byte) (0xff & (value)));
// }
//
// private static Function serializeShort = (x) -> {
// if (null == x) {
// return Collections.emptyList();
// }
//
// Short in = (Short) x;
//
// return Lists.newArrayList((byte) (0xff & (in >> 8)), (byte) (0xff & (in)));
// };
//
// public static List<Byte> doSerialize(Integer value) {
//
// if (null == value) {
// return Collections.emptyList();
// }
//
// List<Byte> out = Lists.newArrayListWithExpectedSize(4);
//
// out.add((byte) (0xff & (value >> 24)));
// out.add((byte) (0xff & (value >> 16)));
// out.add((byte) (0xff & (value >> 8)));
// out.add((byte) (0xff & (value)));
//
// return out;
// }
//
// private static Function serializeInteger = (x) -> {
//
// if (null == x) {
// return Collections.emptyList();
// }
//
// Integer in = (Integer) x;
//
// List<Byte> out = Lists.newArrayListWithExpectedSize(4);
//
// out.add((byte) (0xff & (in >> 24)));
// out.add((byte) (0xff & (in >> 16)));
// out.add((byte) (0xff & (in >> 8)));
// out.add((byte) (0xff & (in)));
//
// return out;
//
// };
//
// public static List<Byte> doSerialize(Long value) {
//
// if (null == value) {
// return Collections.emptyList();
// }
//
// List<Byte> list = Lists.newArrayListWithExpectedSize(8);
//
// list.add((byte) (0xff & (value >> 56)));
// list.add((byte) (0xff & (value >> 48)));
// list.add((byte) (0xff & (value >> 32)));
// list.add((byte) (0xff & (value >> 24)));
// list.add((byte) (0xff & (value >> 16)));
// list.add((byte) (0xff & (value >> 8)));
// list.add((byte) (0xff & (value)));
//
// return list;
// }
//
// private static Function serializeLong = (x) -> {
//
// if (null == x) {
// return Collections.emptyList();
// }
//
// Long in = (Long) x;
//
// List<Byte> list = Lists.newArrayListWithExpectedSize(8);
//
// list.add((byte) (0xff & (in >> 56)));
// list.add((byte) (0xff & (in >> 48)));
// list.add((byte) (0xff & (in >> 32)));
// list.add((byte) (0xff & (in >> 24)));
// list.add((byte) (0xff & (in >> 16)));
// list.add((byte) (0xff & (in >> 8)));
// list.add((byte) (0xff & (in)));
//
// return list;
//
// };
//
// public static List<Byte> doSerialize(Double value) {
//
// if (null == value) {
// return Collections.emptyList();
// }
//
// long double_value = Double.doubleToLongBits(value);
//
// List<Byte> list = Lists.newArrayListWithExpectedSize(8);
//
// list.add((byte) (0xff & (double_value >> 56)));
// list.add((byte) (0xff & (double_value >> 48)));
// list.add((byte) (0xff & (double_value >> 32)));
// list.add((byte) (0xff & (double_value >> 24)));
// list.add((byte) (0xff & (double_value >> 16)));
// list.add((byte) (0xff & (double_value >> 8)));
// list.add((byte) (0xff & (double_value)));
//
// return list;
//
// }
//
// private static Function serializeDouble = (x) -> {
//
// if (null == x) {
// return Collections.emptyList();
// }
//
// Double in = (Double) x;
//
// long double_value = Double.doubleToLongBits(in);
//
// List<Byte> list = Lists.newArrayListWithExpectedSize(8);
//
// list.add((byte) (0xff & (double_value >> 56)));
// list.add((byte) (0xff & (double_value >> 48)));
// list.add((byte) (0xff & (double_value >> 32)));
// list.add((byte) (0xff & (double_value >> 24)));
// list.add((byte) (0xff & (double_value >> 16)));
// list.add((byte) (0xff & (double_value >> 8)));
// list.add((byte) (0xff & (double_value)));
//
// return list;
//
// };
//
// public static List<Byte> doSerialize(String value) {
//
// if (null == value) {
// return Collections.emptyList();
// }
//
// List<Byte> list = Lists.newArrayList();
//
// list.addAll(doSerialize(value.length()));
//
// for (byte _byte : value.getBytes()) {
// list.add(_byte);
// }
//
// return list;
// }
//
// private static Function serializeString = (x) -> {
// if (null == x) {
// return Collections.emptyList();
// }
//
// String in = (String) x;
//
// List<Byte> list = Lists.newArrayList();
//
// list.addAll(doSerialize(in.length()));
//
// for (byte _byte : in.getBytes()) {
// list.add(_byte);
// }
//
// return list;
// };
//
// }
